package voxToolkit;

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

import javax.swing.text.BadLocationException;

import audio.AudioSintetizado;

public class VoxTextAreaEvent implements KeyListener, FocusListener,
		MouseListener
{

	private AudioSintetizado sintetizador;
	VoxContexto voxContexto = VoxContexto.instancia();
	static private VoxTextAreaEvent instancia = null;

	private VoxTextAreaEvent()
	{
		sintetizador = AudioSintetizado.instancia();
	}

	static public VoxTextAreaEvent instancia()
	{
		if (instancia == null)
			instancia = new VoxTextAreaEvent();

		return instancia;
	}

	/**
	 * Fala o caracter quando as setas direita e esquerda são pressionadas,
	 * quando o caracter é apagado e fala a frase inteira quando a tecla F10 é
	 * pressionada.
	 */
	@Override
	public void keyPressed( KeyEvent e )
	{

		VoxTextArea voxTextArea = (VoxTextArea) e.getSource();
		int lastPos = voxTextArea.getCaretPosition();
		String conteudo = voxTextArea.getText();
		int posAtual = voxTextArea.getCaretPosition();
		ArrayList guarda = new ArrayList();

		if (e.getKeyCode() == KeyEvent.VK_LEFT)
		{

			System.out.println("Estou no keyPressed - seta Esquerda");

			if (e.getModifiersEx() == KeyEvent.CTRL_DOWN_MASK)
				System.out.println("teclou CTRL+Seta Esquerda");

			if (lastPos >= 1)
			{
				char caracterAtual = (char) conteudo.codePointAt(lastPos - 1);
				String teste = Character.toString(caracterAtual);
				sintetizador.escreve(teste);
			}
		}

		if (e.getKeyCode() == KeyEvent.VK_RIGHT)
		{

			if (e.getModifiersEx() == KeyEvent.CTRL_DOWN_MASK)
			{
				// Fala palavra a esquerda do cursor
				System.out.println("teclou CTRL+Seta Direita");
			}
			else
			{
				// Fala o caracter da posição

				try
				{
					char letra = (char) conteudo.codePointAt(lastPos); //
					System.out.println("last pos (apos seta direita" + //
							lastPos); // System.out.println("letra : " + letra);
					sintetizador.escreve(Character.toString(letra));
				}
				catch (StringIndexOutOfBoundsException el)
				{
					sintetizador.escreve("Fim de linha");
				}
				catch (Exception e1)
				{
					e1.printStackTrace();
				}

			}
		}

		if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE)
		{
			try
			{
				sintetizador.escreve("DEL "
						+ Character.toString(conteudo.charAt(lastPos - 1)));
			}
			catch (Exception e1)
			{
				// e1.printStackTrace();
				sintetizador.escreve("Inicio da linha");
			}
		}

		if (e.getKeyCode() == KeyEvent.VK_DELETE)
		{
			System.out.println("DEL: aqui primeiro");
			try
			{
				if (lastPos < conteudo.length())
				{

					sintetizador.escreve("DEL "
							+ Character.toString(conteudo.charAt(lastPos)));
				}
				else
				{
					lastPos = lastPos + 1;
				}
			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}

		}

		if (e.getKeyCode() == KeyEvent.VK_F10)
		{
			try
			{
				sintetizador.escreve(conteudo);
			}
			catch (Exception e1)
			{
			}
		}

		if (e.getKeyCode() == KeyEvent.VK_END)
		{

			// Find current row of cursor
			int numLinhaAtual = 0;
			char[] chararr = voxTextArea.getText().toCharArray();
			int caretPos = voxTextArea.getCaretPosition();
			System.out.println("Posicao: " + caretPos);

			for (int i = (caretPos - 1); i >= 0; i--)
			{
				if (chararr[i] == '\n')
				{
					numLinhaAtual++;
				}
			}
			System.out.println("Linha Atual: " + numLinhaAtual);

			try
			{
				System.out.println("Line EndOffSet: "
						+ voxTextArea.getLineEndOffset(numLinhaAtual));

				int posFinalDaLinhaAtual = voxTextArea
						.getLineEndOffset(numLinhaAtual) - 1;

				int posInicioLinhaAtual = voxTextArea
						.getLineStartOffset(numLinhaAtual);
				int posFimLinhaAtual = voxTextArea
						.getLineEndOffset(numLinhaAtual);
				String conteudoLinhaAtual = voxTextArea.getText(
						posInicioLinhaAtual, posFimLinhaAtual
								- posInicioLinhaAtual);

				System.out.println(conteudoLinhaAtual);

				// muda a posição do cursor
				voxTextArea.setCaretPosition(posFinalDaLinhaAtual);

			}
			catch (BadLocationException e1)
			{
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}

	}

	@Override
	public void keyReleased( KeyEvent e )
	{

		System.out.println("Estou no keyRelesead");

		VoxTextArea voxTextArea = (VoxTextArea) e.getSource();
		String conteudo = voxTextArea.getText();
		int posAtual = voxTextArea.getCaretPosition();

		ArrayList guarda = new ArrayList();

		if (e.getKeyCode() == KeyEvent.VK_RIGHT && e.isControlDown())
		{
			try
			{

				// Codigo para varrer o conteudo int j = 0;

				int posFim = posAtual - 1;
				boolean achouLetra = false;
				String palavra = "";

				// System.out.println("PosFim: " + posFim); //
				System.out.println("PosAtual: " + posAtual);

				if (posFim <= conteudo.length() - 1)
				{

					for (int i = posFim; posFim >= 0; --i)
					{
						if (i >= 0)
						{
							if (i <= conteudo.length() - 1)
							{
								if (!Character.isWhitespace(conteudo.charAt(i)))
								{
									guarda.add(conteudo.charAt(i));
									achouLetra = true;
								}

								else
								{
									if (achouLetra)
										break;
								}
							}
							else
								break;
						}
						else
							break;

					}
				}

				// System.out.println("guarda :" + guarda);

				for (int i = guarda.size() - 1; i >= 0; --i)
				{
					palavra = palavra + guarda.get(i).toString();
				}

				sintetizador.escreve(palavra);
				System.out.println(palavra);

			}
			catch (Exception e1)
			{
				e1.printStackTrace();
			}

		}
	}

	/**
	 * Fala cada caracter digitado.
	 * 
	 */
	@Override
	public void keyTyped( KeyEvent e )
	{

		System.out.println("Evento: " + e.getID() + " " + "Estou no keyTyped");

		System.out.println("DEL: keyTyped");
		char tecla;
		VoxTextArea voxTextArea;
		voxTextArea = (VoxTextArea) e.getSource();
		tecla = e.getKeyChar();
		sintetizador.escreve(Character.toString(tecla));
	}

	/**
	 * Fala o rotulo do componente quando este ganha foco.
	 * 
	 */
	@Override
	public void focusGained( FocusEvent e )
	{
	}

	@Override
	public void focusLost( FocusEvent e )
	{
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseClicked( MouseEvent arg0 )
	{
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseEntered( MouseEvent arg0 )
	{
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited( MouseEvent arg0 )
	{
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed( MouseEvent arg0 )
	{
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased( MouseEvent arg0 )
	{
		// TODO Auto-generated method stub

	}

}